package com.github.llyb120.mugen;

import lombok.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.Map;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExecutableMethod {
    Executable executable;
    Method method;
    Object instance;

    @SneakyThrows
    public Object invoke(Object... _args) {
        Object[] args = new Object[method.getParameterCount()];
        for (int i = 0; i < _args.length; i++) {
            args[i] = _args[i];
        }
        return method.invoke(instance, args);
    }

//    public Object invoke() {
//        return invoke(null);
//    }
//
//    public static Object[] convertParams(Method method, Map<String, ?> params) {
//        return Arrays.stream(method.getParameters())
//                .map(e -> {
//                    //只留下名字匹配
//                    //优先名字匹配
//                    Object value = null;
//                    if(params.containsKey(e.getName())){
//                        value = params.get(e.getName());
//                        if (value != null) {
//                            if (e.getType().isAssignableFrom(value.getClass())) {
//                                return value;
//                            } else if(e.getType().isAssignableFrom(String.class)){
//                                //尝试简单的转换
//                                return String.valueOf(value);
//                            }
//                        }
//                    }
//                    //基本类型不能为空
//                    if (value == null) {
//                        switch (e.getType().getSimpleName()){
//                            case "boolean":
//                                return false;
//                        }
//                    }
//                    return value;
//                    //类型匹配
////                    Object value = params.values().stream().filter(val -> val != null && val.getClass().isAssignableFrom(e.getType()))
////                            .findFirst()
////                            .orElse(null);
////                    return value;
//                })
//                .toArray();
//    }
}
